//
//  JKMainTabBarController.swift
//  JKWeibo
//
//  Created by albert on 16/5/11.
//  Copyright © 2016年 albert. All rights reserved.
//

import UIKit

class JKMainTabBarController: UITabBarController {
    
    override class func initialize(){
        
        let bar = UITabBar.appearance()
        bar.tintColor = UIColor.orangeColor()
    }
    
    /** 底部按钮的数量 */
    private let tabBarBtnCount: CGFloat = 5
    
    // MARK: - 懒加载发布按钮
    private lazy var composeButton: UIButton = {
        
        // 1.使用自定义便利构造方法快速创建button
        let button = UIButton(imageName: "tabbar_compose_icon_add", backgroundImageName: "tabbar_compose_button")
        
        // 2.添加点击事件
        button.addTarget(self, action: "composeClick", forControlEvents: UIControlEvents.TouchUpInside)
        
        return button
    }()
    
    // MARK: - 在这里布局子控件，或者在viewWillAppear也可以
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        
        // 保证加号按钮在最后添加，确保在最上面
        tabBar.addSubview(composeButton)
        
        // 让加号按钮的宽度稍微宽一点，确保完全盖住后面的tabBarButton
        composeButton.width = tabBar.width / (tabBarBtnCount - 0.2)
        composeButton.centerX = tabBar.centerX
        composeButton.centerY = tabBar.height * 0.5
        
        //let width = tabBar.width / 5.0
        // 不知道为什么，偏移一个宽度才会到中间，应该尼玛的偏移两个宽度啊！！
        //composeButton.frame = CGRectOffset(composeButton.frame, width, 0)
    }

    // 加上 @objc就代表告诉系统需要动态派发
    //MARK: - 发布按钮点击
    @objc private func composeClick(){
        let composeVc = R.storyboard.jKCompose.initialViewController!
        presentViewController(composeVc, animated: true, completion: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // iOS7以后，只需要设置tintColor，那么图片和文字都会按照tintColor来渲染，而且只渲染高亮状态？
        tabBar.tintColor = UIColor.orangeColor()
        
        // 添加所有的子控制器
        addChildVcs()
    }
    
    //MARK: - 添加所有的子控制器
    private func addChildVcs(){
        
        // 1.根据JSON文件创建控制器
        // 1.1读取JSON数据
        guard let filePath = NSBundle.mainBundle().pathForResource("MainVCSettings.json", ofType: nil) else {
            JKLog("JSON文件不存在")
            return
        }
        
        guard let data = NSData(contentsOfFile: filePath) else {
            JKLog("加载JSON数据失败")
            return
        }

        // 1.2将JSON数据转换为对象（数组字典）
        do{// 到时候是通过服务器获取数据，如果有数据，就执行这里的数据，加载对应活动的控制器
            
            let objc = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as! [[String : AnyObject]]
            
            // 1.3遍历数组字典取出每一个字典
            for dict in objc {
                // 1.4根据遍历到的字典创建控制器
                let title = dict["title"] as? String
                let vcName = dict["vcName"] as? String
                let imageName = dict["imageName"] as? String
                setupChildVc(vcName, title: title, imageName: imageName)
            }
            
        }catch{// 服务器未返回数据时，就执行这里的代码，加载默认的控制器
            setupChildVc("JKHomeTableViewController", title: "主页", imageName: "tabbar_home")
            setupChildVc("JKMessageTableViewController", title: "消息", imageName: "tabbar_message_center")
            setupChildVc("NullViewController", title: nil, imageName: nil)
            setupChildVc("JKDiscoverTableViewController", title: "发现", imageName: "tabbar_discover")
            setupChildVc("JKProfileTableViewController", title: "我", imageName: "tabbar_profile")
        }
    }

    //MARK: - 初始化子控制
    // 将参数改为可选类型，在内部进行可选绑定判断
    private func setupChildVc(childVcName: String?, title: String?, imageName: String?) {
        
        // 1.动态获取命名空间
        guard let name = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as? String else {
            JKLog("获取命名空间失败")
            return
        }
        
        // 2.根据字符串获取Class
        var cls: AnyClass? = nil
        if let vcName = childVcName {
            // 不加上: AnyClass?会有警告
            cls = NSClassFromString(name + "." + vcName)
        }
        
        // 3.根据Class创建对象
        // Swift中如果想通过一个Class来创建一个对象，必须告诉系统这个Class确切的类型。AnyClass?是不能创建对象的
        guard let typeCls = cls as? UITableViewController.Type else {
            JKLog("cls不能当做UITableViewController")
            return
        }
        
        // 创建控制器
        let viewController = typeCls.init()
        
        // title不需要可选绑定判断了，因为系统就是可选类型
        viewController.title = title
        
        // 4.设置控制器相关属性
        if let imgName = imageName where (imageName != "") {
            viewController.tabBarItem.image = UIImage(named: imgName)
            
            // 因为高亮图片有规律，直接加上后缀就行
            viewController.tabBarItem.selectedImage = UIImage(named: imgName + "_highlighted")
        }
        
        // 5.包装成导航控制器
        let nav = JKMainNavigationController(rootViewController: viewController)
        
        // 6.添加子控制器
        addChildViewController(nav)
    }
}
